package main

import (
	"fmt"
	"log"
	"os"
)

// defer 在函数结束时被调用
// 不合理的使用会平白消耗资源
func deferWrongUsage() {
	for i := 0; i < 10000; i++ {
		path := fmt.Sprintf("./log/%d.txt", i)

		f, err := os.Open(path)
		if err != nil {
			log.Println(err)
			continue
		}

		defer f.Close()

		// ... do something ...
	}
}

// 正确用法：
// 直接调用，或者重构为函数，让循环和处理算法分离
func deferRightUsage(id int) {
	path := fmt.Sprintf("./log/%d.txt", id)

	f, err := os.Open(path)
	if err != nil {
		log.Println(err)
		return
	}

	defer f.Close()

	// ... do something ...
}

func main() {
	for i := 0; i < 10000; i++ {
		deferRightUsage(i)
	}
}
